Coding5 - 📋 Task Management Features
Method | Endpoint | Description |
---|---|---|
POST | /api/tasks | Create a new task |
GET | /api/tasks | Get all tasks (with optional filters) |
GET | /api/tasks/:taskId | Get a specific task by ID |
PUT | /api/tasks/:taskId | Update a task (e.g., due date, priority, etc) |
DELETE | /api/tasks/:taskId | Delete a task |
✅ Step 1: Create the Task Model
File: src/model/task.model.ts
import mongoose, { Schema, Document } from 'mongoose';
export interface ITask extends Document {
title: string;
description?: string;
dueDate?: Date;
priority?: 'low' | 'medium' | 'high';
isCompleted: boolean;
userId: mongoose.Types.ObjectId;
}
const TaskSchema: Schema<ITask> = new Schema({
title: { type: String, required: true },
description: String,
dueDate: Date,
priority: { type: String, enum: ['low', 'medium', 'high'], default: 'medium' },
isCompleted: { type: Boolean, default: false },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
}, { timestamps: true });
export default mongoose.model<ITask>('Task', TaskSchema);
✅ Step 2: Create the Task Controller
File: src/controller/task.controller.ts
import { Request, Response } from 'express';
import Task from '../model/task.model';
// Create new task
export const createTask = async (req: Request, res: Response) => {
try {
const newTask = await Task.create(req.body);
res.status(201).json(newTask);
} catch (error) {
res.status(400).json({ message: 'Failed to create task', error });
}
};
// Get all tasks (optionally filter by due date or priority)
export const getAllTasks = async (req: Request, res: Response) => {
try {
const filter: any = {};
if (req.query.priority) filter.priority = req.query.priority;
if (req.query.dueDate) filter.dueDate = req.query.dueDate;
const tasks = await Task.find(filter);
res.json(tasks);
} catch (error) {
res.status(500).json({ message: 'Failed to fetch tasks', error });
}
};
// Get single task by ID
export const getTaskById = async (req: Request, res: Response) => {
try {
const task = await Task.findById(req.params.taskId);
if (!task) return res.status(404).json({ message: 'Task not found' });
res.json(task);
} catch (error) {
res.status(500).json({ message: 'Error fetching task', error });
}
};
// Update a task by ID
export const updateTask = async (req: Request, res: Response) => {
try {
const updatedTask = await Task.findByIdAndUpdate(req.params.taskId, req.body, { new: true });
if (!updatedTask) return res.status(404).json({ message: 'Task not found' });
res.json(updatedTask);
} catch (error) {
res.status(400).json({ message: 'Failed to update task', error });
}
};
// Delete a task by ID
export const deleteTask = async (req: Request, res: Response) => {
try {
const deletedTask = await Task.findByIdAndDelete(req.params.taskId);
if (!deletedTask) return res.status(404).json({ message: 'Task not found' });
res.json({ message: 'Task deleted successfully' });
} catch (error) {
res.status(500).json({ message: 'Failed to delete task', error });
}
};
✅ Step 3: Create Task Routes
File: src/routes/task.routes.ts
import { Router } from 'express';
import {
createTask,
getAllTasks,
getTaskById,
updateTask,
deleteTask
} from '../controller/task.controller';
const router = Router();
router.post('/', createTask);
router.get('/', getAllTasks);
router.get('/:taskId', getTaskById);
router.put('/:taskId', updateTask);
router.delete('/:taskId', deleteTask);
export default router;
✅ Step 4: Register Routes in app.ts
File: src/app.ts
Add this line under your auth routes:
import taskRoutes from './routes/task.routes';
app.use('/api/tasks', taskRoutes);
✅ Resulting API Endpoints
Method | Endpoint | Description |
---|---|---|
POST | /api/tasks | Create a task |
GET | /api/tasks | Get all tasks (filters) |
GET | /api/tasks/:taskId | Get a specific task |
PUT | /api/tasks/:taskId | Update a task |
DELETE | /api/tasks/:taskId | Delete a task |